package com.lagou.module2.task3;

import com.lagou.module2.task3.card.SIMCard;
import com.lagou.module2.task3.card.UserInfo;
import com.lagou.module2.task3.card.typeEnum;
import com.lagou.module2.task3.play.CallService;
import com.lagou.module2.task3.play.NetworkService;
import com.lagou.module2.task3.play.Package;
import com.lagou.module2.task3.play.impl.CallServiceImpl;
import com.lagou.module2.task3.play.impl.NetworkServiceImpl;

/**
 *
 * 测试类，使用多态格式分别调用方法
 * 方法体中打印一句话进行功能测试
 *
 */
public class MyTest {

    public static void main(String[] args) {
        //初始化手机卡
        SIMCard simCard = new SIMCard();
        // 用户名：小张, 密码：1234，账户余额：200，卡号：18513045896，卡类型：大卡，通话时长(分钟): 60, 上网流量(MB): 500
        simCard.setUserName("小张");
        simCard.setPassword("1234");
        simCard.setAccountBalance(200);
        simCard.setCardNumber("18513045896");
        simCard.setCardType(typeEnum.BIG);
        simCard.setCallDuration(60);
        simCard.setMobileInternetData(500);
        //显示(卡号 + 用户名 + 当前余额)
        simCard.show();

        // 初始化通话套餐，通话时长：60，短信条数：20， 每月资费：30
        CallServiceImpl myCall = new CallServiceImpl(simCard.getCallDuration(), 20, 30);
        // 初始化上网套餐，上网流量(MB): 500, 每月资费：20.
        NetworkServiceImpl myNetwork = new NetworkServiceImpl(simCard.getMobileInternetData(), 20);

        // 通过参数传递形成多态，显示所有套餐信息
        showPackageInfo(myCall);
        showPackageInfo(myNetwork);

        //初始化用户消费信息
        UserInfo userInfo = new UserInfo();
        // 统计使用的通话时长：30， 统计使用的上网流量(MB):100, 每月消费金额：50 = 通话套餐每月资费 + 上网套餐每月流量
        userInfo.setCallDuration(30);
        userInfo.setMobileInternetData(100);
        userInfo.setMonthlyCharges(50);

        // 服务接口的引用
        CallService callService;
        NetworkService networkService;

        // 使用多态调用方法
        callService = myCall;
        networkService = myNetwork;
        // 开启打电话服务
        callService.call(userInfo.getCallDuration(), simCard);
        // 开启上网服务
        networkService.connect(userInfo.getMobileInternetData(), simCard);

        // 再次查看套餐信息
        showPackageInfo(myCall);
        showPackageInfo(myNetwork);
    }

    /**
     * 利用多态显示套餐信息
     * @param myPackage 套餐抽象类的形参
     */
    public static void showPackageInfo(Package myPackage){
        myPackage.show();
    }

}
